<?php
class AIngresoExtra {

	public function __construct() {
	}

	public function condicionPago(EFacade & $facade) {
		$ezpdo_=getManager();
		$session=$facade->session;
		$docFC = & $facade->getDocumentRoot();
		$listaProductos=$docCP->listaProductos;
		$cliente=&$docFC->cliente;
		if($cliente->cuenta==NULL){
			$cuentaCliente=$session->create(MCuentaCliente);
			$cliente->cuenta=$cuentaCliente;
		}
		$cuentaCliente=&$cliente->cuenta;
		$listaCuotas=&$cuentaCliente->cuotasCliente;
		$saldoCliente=$cliente->cuenta->getSaldo();
		$cuentaCliente->commit();
		$listaIngresos=&$cuentaCliente->ingresosCliente;
		$listaIngresos[]=$docFC;
		$totalPagado=0;
		$fechaTransaccion=stringToTime($docFC->fechaTransaccion);
		$docFC->fechaTransaccion=$fechaTransaccion;
		$formasPago=$docFC->formaPagoList;
		foreach($formasPago as $formaPago){
			$montoImpuesto=0;
			$montoPagado=stringToNumber($formaPago->montoPago);
			$totalPagado+=$montoPagado;
			if($formaPago->formaPago->cuentaBancaria)
				$cta = $formaPago->formaPago->cuentaBancaria->cuentaContable;
			else
				$cta = $formaPago->formaPago->cuentaCaja->cuentaContable;
			$cta->aumenta($montoPagado,$docFC);
			if($cuentaCaja=&$formaPago->formaPago->cuentaCaja!=NULL){
				$saldoCajaViejo=$cuentaCaja->saldo;
				$sql='FROM MTipoTransaccion as t where t.cuentaCaja.oid = ?';
				$transacciones=$ezpdo_->find($sql,$cuentaCaja->epGetObjectId());
				$tipoTransaccion=$transacciones[0];
				$montoAumento=0;
				if($porcentaje=$tipoTransaccion->porcentajeComision>0){
					$montoNuevo=$montoPagado*$porcentaje/100;
					$montoImpuesto-=$montoNuevo;
					$transaccion=$session->create('MTransaccion');
					$fechaTransaccion=time();
					$montoTransaccion=$montoNuevo;
					$transaccion->esCaja=TRUE;
					$transaccion->fechaTransaccion=$fechaTransaccion;
					$transaccion->montoTransaccion=$montoTransaccion;
					$transaccion->debe=$montoTransaccion;
					$descripcion="Comision  ".$porcentaje ." %";
					$transaccion->descripcion=$descripcion;
					$transaccion->tipoTransaccion=$tipoTransaccion;
					$transaccion->cuentaCaja=$cuentaCaja;
					$transaccion->commit();
					$facade->session->evictAll('MTransaccion');
				}
				if($porcentaje=$tipoTransaccion->montoComision >0){
					$montoImpuesto-=$porcentaje;
					$transaccion=$session->create('MTransaccion');
					$fechaTransaccion=time();
					$montoTransaccion=$porcentaje;
					$transaccion->esCaja=TRUE;
					$transaccion->fechaTransaccion=$fechaTransaccion;
					$transaccion->montoTransaccion=$montoTransaccion;
					$transaccion->debe=$montoTransaccion;
					$descripcion="Comision  ".$porcentaje ." BsF";
					$transaccion->descripcion=$descripcion;
					$transaccion->tipoTransaccion=$tipoTransaccion;
					$transaccion->cuentaCaja=$cuentaCaja;
					//echo "<br>la transaccion es: ",$transaccion;
					$facade->session->evictAll('MTransaccion');
				}
				if($porcentaje=$tipoTransaccion->porcentajeImpuesto >0){
					$montoNuevo=$montoPagado*$porcentaje/100;
					$montoImpuesto-=$montoNuevo;
					$transaccion=$session->create('MTransaccion');
					$fechaTransaccion=time();
					$montoTransaccion=$montoNuevo;
					$transaccion->esCaja=TRUE;
					$transaccion->fechaTransaccion=$fechaTransaccion;
					$transaccion->montoTransaccion=$montoTransaccion;
					$transaccion->debe=$montoTransaccion;
					$descripcion="Impuesto ".$porcentaje ." %";
					$transaccion->descripcion=$descripcion;
					$transaccion->tipoTransaccion=$tipoTransaccion;
					$transaccion->cuentaCaja=$cuentaCaja;
					$transaccion->commit();
					//echo "<br>la transaccion es: ",$transaccion;
					$facade->session->evictAll('MTransaccion');
				}
				if($porcentaje=$tipoTransaccion->montoImpuesto >0){
					$montoImpuesto-=$porcentaje;
					$transaccion=$session->create('MTransaccion');
					$fechaTransaccion=time();
					$montoTransaccion=$porcentaje;
					$transaccion->esCaja=TRUE;
					$transaccion->fechaTransaccion=$fechaTransaccion;
					$transaccion->montoTransaccion=$montoTransaccion;
					$transaccion->debe=$montoTransaccion;
					$descripcion="Impuesto ".$porcentaje ." BsF";
					$transaccion->descripcion=$descripcion;
					$transaccion->tipoTransaccion=$tipoTransaccion;
					$transaccion->cuentaCaja=$cuentaCaja;
					$transaccion->commit();
					//echo "<br>la transaccion es: ",$transaccion;
					$facade->session->evictAll('MTransaccion');
				}
				//Crear la transaccion
				$transaccion=$session->create('MTransaccion');
				$fechaTransaccion=time();
				$montoTransaccion=$montoPagado+$montoImpuesto;
				$transaccion->esCaja=TRUE;
				$transaccion->fechaTransaccion=$fechaTransaccion;
				$transaccion->montoTransaccion=$montoTransaccion;
				$transaccion->debe=$montoTransaccion;
				$detalle=" con ".$formaPago->formaPago->nombre." ".$formaPago->detalle;
				$descripcion=$docFC->cliente->nombre." - Ing Extraord - ".$docFC->concepto." ".$detalle;
				$transaccion->descripcion=$descripcion;
				$transaccion->tipoTransaccion=$tipoTransaccion;
				$transaccion->cuentaCaja=$cuentaCaja;
				$transaccion->documento=$docFC;
				$saldoCajaNuevo=$saldoCajaViejo+$montoPagado+$montoImpuesto;
				$cuentaCaja->saldo=$saldoCajaNuevo;
				$transaccion->saldoCuenta = $saldoCajaNuevo;
				
			} else {
				//echo "<br>entra aqui en el else";
				$cuentaCaja=&$formaPago->formaPago->cuentaBancaria;
				$saldoCajaViejo=$cuentaCaja->saldo;
				$sql='FROM MTipoTransaccion as t where t.cuentaBancaria.oid = ?';
				$transacciones=$ezpdo_->find($sql,$cuentaCaja->epGetObjectId());
				$tipoTransaccion=$transacciones[0];
				$montoAumento=0;
				if($porcentaje=$tipoTransaccion->porcentajeComision>0){
					$montoNuevo=$montoPagado*$porcentaje/100;
					$montoImpuesto-=$montoNuevo;
					$transaccion=$session->create('MTransaccion');
					$fechaTransaccion=time();
					$montoTransaccion=$montoNuevo;
					$transaccion->esBanco=TRUE;
					$transaccion->fechaTransaccion=$fechaTransaccion;
					$transaccion->montoTransaccion=$montoTransaccion;
					$transaccion->debe=$montoTransaccion;
					$descripcion="Comision  ".$porcentaje ." %";
					$transaccion->descripcion=$descripcion;
					$transaccion->tipoTransaccion=$tipoTransaccion;
					$transaccion->cuentaCaja=$cuentaCaja;
					$transaccion->commit();
					//echo "<br>la transaccion es: ",$transaccion;
					$facade->session->evictAll('MTransaccion');
				}
				if($porcentaje=$tipoTransaccion->montoComision >0){
					$montoImpuesto-=$porcentaje;
					$transaccion=$session->create('MTransaccion');
					$fechaTransaccion=time();
					$montoTransaccion=$porcentaje;
					$transaccion->esBanco=TRUE;
					$transaccion->fechaTransaccion=$fechaTransaccion;
					$transaccion->montoTransaccion=$montoTransaccion;
					$transaccion->debe=$montoTransaccion;
					$descripcion="Comision  ".$porcentaje ." BsF";
					$transaccion->descripcion=$descripcion;
					$transaccion->tipoTransaccion=$tipoTransaccion;
					$transaccion->cuentaCaja=$cuentaCaja;
					//echo "<br>la transaccion es: ",$transaccion;
					$facade->session->evictAll('MTransaccion');
				}
				if($porcentaje=$tipoTransaccion->porcentajeImpuesto >0){
					$montoNuevo=$montoPagado*$porcentaje/100;
					$montoImpuesto-=$montoNuevo;
					$transaccion=$session->create('MTransaccion');
					$fechaTransaccion=time();
					$montoTransaccion=$montoNuevo;
					$transaccion->esBanco=TRUE;
					$transaccion->fechaTransaccion=$fechaTransaccion;
					$transaccion->montoTransaccion=$montoTransaccion;
					$transaccion->debe=$montoTransaccion;
					$descripcion="Impuesto ".$porcentaje ." %";
					$transaccion->descripcion=$descripcion;
					$transaccion->tipoTransaccion=$tipoTransaccion;
					$transaccion->cuentaCaja=$cuentaCaja;
					$transaccion->commit();
					//echo "<br>la transaccion es: ",$transaccion;
					$facade->session->evictAll('MTransaccion');
				}
				if($porcentaje=$tipoTransaccion->montoImpuesto >0){
					$montoImpuesto-=$porcentaje;
					$transaccion=$session->create('MTransaccion');
					$fechaTransaccion=time();
					$montoTransaccion=$porcentaje;
					$transaccion->esBanco=TRUE;
					$transaccion->fechaTransaccion=$fechaTransaccion;
					$transaccion->montoTransaccion=$montoTransaccion;
					$transaccion->debe=$montoTransaccion;
					$descripcion="Impuesto ".$porcentaje ." BsF";
					$transaccion->descripcion=$descripcion;
					$transaccion->tipoTransaccion=$tipoTransaccion;
					$transaccion->cuentaCaja=$cuentaCaja;
					$transaccion->commit();
					//echo "<br>la transaccion es: ",$transaccion;
					$facade->session->evictAll('MTransaccion');
				}
				$transaccion=$session->create('MTransaccion');
				$fechaTransaccion=time();
				$montoTransaccion=$montoPagado+$montoImpuesto;
				$transaccion->esBanco=TRUE;
				$transaccion->fechaTransaccion=$fechaTransaccion;
				$transaccion->montoTransaccion=$montoTransaccion;
				$transaccion->debe=$montoTransaccion;
				$detalle=" con ".$formaPago->formaPago->nombre." ".$formaPago->detalle;
				$descripcion = $docFC->cliente->nombre." - Ing Extraord - ".$docFC->concepto." ".$detalle;
				$transaccion->descripcion=$descripcion;
				$transaccion->tipoTransaccion=$tipoTransaccion;
				$transaccion->cuentaBanco=$cuentaCaja;
				$transaccion->documento=$docFC;
				$saldoCajaNuevo=$saldoCajaViejo+$montoPagado+$montoImpuesto;
				$cuentaCaja->saldo=$saldoCajaNuevo;
				$transaccion->saldoCuenta = $saldoCajaNuevo;			
			}
			$transaccion->commit();
			$cuentaCaja->commit();
		}
		$totalAPagar=stringToNumber($docFC->montoIngreso);
		$docFC->montoIngreso=$totalAPagar;
		$docFC->fechaTransaccion=stringToTime($docFC->fechaTransaccion);
		$restantePorPagar=$totalAPagar-$totalPagado; 
		$montoDeuda=$restantePorPagar;
		$docFC->commit();
		$docFC->numero = $docFC->getDocumentNumber();
		////////////////////////////////////////////
		$condicionPago=$docFC->condicionPago;
		$montoCuentaPorCobrar=0;
		$montoTotal=$totalAPagar;
		$porcentajeRestante=0;
		foreach($condicionPago->plazo as $plazo){
			if($plazo->diasPlazo == 0){
				//echo "<hr>entro a crear el recibo";
				$porcentaje=$plazo->porcentaje;
				$porcentajeRestante=100-$porcentaje;
				$montoPorCobrar=$restantePorPagar;
				$montoTotal=100*$restantePorPagar/$porcentajeRestante;
				$fecha=time();
				$docRF=$session->create('DReciboFactura');
				$newEfacade =& EFacade :: initWorkflow($facade->session, $docRF, & $role);
				$docRF->montoPago=$totalPagado;
				$concepto="Ingreso Extraordinario - ".$docFC->getConcepto();
				$docRF->concepto=$concepto;
				$docRF->fecha=$fecha;
				$docRF->cliente = $docFC->cliente;
				$docRF->ingreso = $docFC;
				$transSetOT = & EFacade :: getCurrentTransSetAuto($newEfacade->getWorkflow(), /* PROCESS */ 3);
				$transOT = $transSetOT->getTransByName('t1');
				$usuario=NULL;
				$newEfacade->fireTrans($transOT, $usuario, "Crear",TRUE);
				$docRF->epSetDirty(TRUE);
				$newEfacade->saveWorkflow();
				$docRF->diferenciador=$docRF->getDocumentDifer();
				$docRF->commit();
				$docRF->numero = $docRF->getDocumentNumber();
				$docRF->diferenciador=$docRF->getDocumentDifer();
				$docRF->commit();
				unset($newEfacade);
				$facade->session->evictAll('MEdge');
				$facade->session->evictAll('MTrans');
				$facade->session->evictAll('MPlace');
				break;
			}
		}
		if($restantePorPagar>0){
			$numero=0;
			$plazos= $condicionPago->plazo;
			$toti = 0;
			foreach($plazos as $plazo)
				if($plazo->diasPlazo != 0)
					$toti++;
			foreach($plazos as $plazo){
				if($plazo->diasPlazo != 0){
					//echo "<hr>entro a crear las cuotas";
					$porcentaje=$plazo->porcentaje;
					$montoCuota=$montoTotal*$porcentaje/100;
					$diasPlazo=$plazo->diasPlazo;
					$segundosPlazo=$diasPlazo*86400;
					$fechaActual=time();
					$fechaVencimiento=$fechaActual+$segundosPlazo;
					 if($docFC->tieneGiro){
					 	$numero++;
					 	$fechaVencimiento=$fechaActual+$segundosPlazo;
					 	$docGC=$session->create('DGiroCliente');
					 	$docGC->ingreso = $docFC;
					 	$docGC->cliente = $docFC->cliente;
					 	$docGC->numeroGiro=$numero;
					 	$docGC->cuentaCliente=$cuentaCliente;
					 	$docGC->fechaTransaccion=$fechaActual;
					 	$docGC->fechaVencimiento=$fechaVencimiento;
					 	$docGC->montoGiro=$montoCuota;
						$role=NULL;
						$newEfacade =& EFacade :: initWorkflow($facade->session, $docGC, & $role);
						$transSetOT = & EFacade :: getCurrentTransSetAuto($newEfacade->getWorkflow(), /* PROCESS */ 3);
						$placeSet = EFacade :: getCurrentPlaceSet($newEfacade->getWorkflow());
						$transOT = $transSetOT->getTransByName('t1');
						$usuario = $docFC->usuario;
						$IdDep = $usuario->empleado->departamento->identificadorUnico;
						$departamento = $usuario->empleado->departamento;
						$dptoVarietyList = $placeSet->dptoVarietyList;
						foreach ($dptoVarietyList as $d)
							if ($d->dptoName == $IdDep) {
								$docGC->departamento = $departamento;
								$docGC->variante = $d->variantList[0];
							}
						$usuario=NULL;
						$newEfacade->fireTrans($transOT, $usuario, "Crear",TRUE);
						$docGC->epSetDirty(TRUE);
						$newEfacade->saveWorkflow();
						$docGC->diferenciador=$docGC->getDocumentDifer();
						$docGC->commit();
						$docGC->numero = $docGC->getDocumentNumber();
						$docGC->diferenciador=$docGC->getDocumentDifer();
						$docGC->commit();
						/*************** ponerlas en la cuenta proveedor ******************/
						$histi = $session->create('MListaHistoricoCuentas');
						$histi->referencia = $docFC->cliente->nombre." - Giro ".$numero."/".$toti." - ".$docGC->numero." - ".floatToString($montoCuota)." vence: ".dateToString($fechaVencimiento)." - ".$docFC->numero;
						$histi->cuentaCliente = $cuentaCliente;
						$histi->saldo = $cuentaCliente->saldo - $montoCuota;
						$histi->fecha = $fechaActual;
						$histi->commit();
						$cuentaCliente->saldo = $histi->saldo;
						$cuentaCliente->giroCliente[] = $docGC;
						$cuentaCliente->commit();
						/******************************************************************/
						unset($newEfacade);
						$facade->session->evictAll('MEdge');
						$facade->session->evictAll('MTrans');
						$facade->session->evictAll('MPlace');
						
					 } else {
					 	$numero++;
					 	$cuota=$session->create('MCuotaCliente');
						$cuota->fechaVencimiento=$fechaVencimiento;
						$cuota->montoCuota=$montoCuota;
						$cuota->refFactura = $docFC->cliente->nombre." - Cuota ".$numero."/".$toti." - ".floatToString($montoCuota)." vence: ".dateToString($fechaVencimiento)." - ".$docFC->numero;
						$cuota->status=FALSE;
						$cuota->ingreso=$docFC;
						$cuota->commit();
						/*************** ponerlas en la cuenta proveedor ******************/
						$histi = $session->create('MListaHistoricoCuentas');
						$histi->referencia = $cuota->refFactura;
						$histi->cuentaCliente = $cuentaCliente;
						$histi->saldo = $cuentaCliente->saldo - $montoCuota;
						$histi->fecha = $fechaActual;
						$histi->commit();
						$cuentaCliente->saldo = $histi->saldo;
						$cuentaCliente->cuotasCliente[] = $cuota;
						$cuentaCliente->commit();
						/******************************************************************/
					 }
				}
			}
			/******* AFECTAR LAS CUENTAS POR COBRAR ****************/
			$docFC->cuentas[$docFC->cuentaAfectar]->aumenta($restantePorPagar,$docFC);
			$docFC->cuentas[$docFC->cuentaAfectar]->commit();
			/********************************************************/	
		}
		$workflowFC = & $docFC->getWorkflowRef();
		$facade->session->refresh($workflowFC);
		$transSetFC = & EFacade :: getCurrentTransSetAuto($workflowFC, /* MTrans :: $TYPE_AUTO_AGENT */	2);
		if(count($plazos) >1){
			$transFC = & $transSetFC->getTransByName('t3');
		}
		else {
			$transFC = & $transSetFC->getTransByName('t2');
		}
		
		$user=NULL;
		$facade->fireTrans($transFC, $user, 'Generacion de Factura', FALSE);

		$workflowFC->epSetDirty(TRUE); // marcar el workflow para que sea salvado los cambios en sus worktrans
		$docFC->epSetDirty(TRUE); // marcar el documento para que sea salvado los cambios en su lista de items
		$facade->saveWorkflow();	
	}
	
	public function totalPagos(EFacade & $facade) {
		
		
		 
		 $docFC = & $facade->getDocumentRoot();
		 
		 
		 
		 //verificar si los pagos se han realizado o no
		/**TODO: Verificar los pagos realziados a giros y/o cuotas
		 * 
		 */
		 $todoPago=TRUE;
		 
		 
		 
		$workflowFC = & $docFC->getWorkflowRef();
		$facade->session->refresh($workflowFC);
		$transSetFC = & EFacade :: getCurrentTransSetAuto($workflowFC, /* MTrans :: $TYPE_AUTO_AGENT */	2);
		
		if($todoPago){
			$transFC = & $transSetFC->getTransByName('t6');
		}
		else {
			$transFC = & $transSetFC->getTransByName('t5');
		}
		
		$user=NULL;
		$facade->fireTrans($transFC, $user, 'Verificación de pago completo', FALSE);

		$workflowFC->epSetDirty(TRUE); // marcar el workflow para que sea salvado los cambios en sus worktrans
		$docFC->epSetDirty(TRUE); // marcar el documento para que sea salvado los cambios en su lista de items
		$facade->saveWorkflow();	
		 	

		 
		 
		
	}
}
?>